import { Point3d } from "./Point3d";
export function isVec(pt){
  if(pt instanceof Vector2d) return true;
  return false;
}
export class Vector2d {
  // 参数可以是点或 xy值
  constructor(startPt, endPt) {
    if (startPt && endPt) {
      if (startPt instanceof Point3d
        || endPt instanceof Point3d) {
        this.x = endPt.x - startPt.x;
        this.y = endPt.y - startPt.y;
      } else if (typeof startPt === 'number'
        || typeof endPt === 'number') {
        this.x = startPt;
        this.y = endPt;
      }
    }
  }
  get length() {
    let xx = Math.pow(this.x, 2)
    let yy = Math.pow(this.y, 2)
    return Math.sqrt(xx + yy)
  }
  // 单元化
  get d() {
    return this.mul(1 / this.length);
  }
  // 单元法线
  get n() {
    let dir = this.d
    // let pt = new Vector2d(dir.y, -dir.x);
    return new Vector2d(dir.y, -dir.x)
  }
  // 乘长度
  mul(length) {
    this.x *= length;
    this.y *= length;
    return this;
  }

  // 点乘：结果为0表示垂直
  // 几何含义:是 a 向量乘以 b 向量在 a 向量上的投影分量
  // 平行：当 a、b 两个向量平行时，它们的夹角就是 0°，那么 a·b=|a|*|b|
  //      a.x * b.x + a.y * b.y === a.length * b.length； 存在误差时，不好判断
  // 垂直：当 a、b 两个向量垂直时，那么 a·b=0
  dotProduct(vec) {
    return this.x * vec.x + this.y * vec.y;
  }
  // 叉乘
  // 物理意义：二维空间中向量叉乘的物理意义就是 a 和 b 的力矩（力矩你可以理解为一个物体在力的作用下，
  //  绕着一个轴转动的趋向。它是一个向量，等于力臂 L 和力 F 的叉乘
  // 点到线段的距离：
  //  通过向量叉积得到平行四边形面积，再除以底边长，就能得到点到向量所在直线的距离
  $cross(vec) {
    return this.x * vec.y - this.y * vec.x
  }
}